package com.galen.manual.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.galen.manual.dto.AdminLoginDTO;
import com.galen.manual.dto.SendSmsDTO;
import com.galen.manual.dto.SmsLoginDTO;
import com.galen.manual.dto.UserLoginDTO;
import com.galen.manual.dto.UserProfileDTO;
import com.galen.manual.dto.UserQueryDTO;
import com.galen.manual.vo.AdminLoginVO;
import com.galen.manual.vo.UserInfoVO;
import com.galen.manual.vo.UserLoginVO;
import com.galen.manual.vo.UserManagementVO;
import com.galen.manual.vo.UserStatsVO;

public interface UserService {

    /**
     * 用户登录
     * @param loginDTO 登录信息
     * @return JWT Token
     */
    String login(UserLoginDTO loginDTO);

    /**
     * 短信验证码登录
     * @param loginDTO 登录信息
     * @param loginIp 登录IP
     * @return 登录响应信息
     */
    UserLoginVO smsLogin(SmsLoginDTO loginDTO, String loginIp);

    /**
     * 发送短信验证码
     * @param sendSmsDTO 发送短信请求
     * @param ipAddress 请求IP地址
     */
    void sendSmsCode(SendSmsDTO sendSmsDTO, String ipAddress);

    /**
     * 管理员登录
     * @param loginDTO 登录信息
     * @param loginIp 登录IP
     * @return 登录响应信息
     */
    UserLoginVO adminLogin(AdminLoginDTO loginDTO, String loginIp);

    /**
     * 获取用户信息
     * @return 用户信息
     */
    UserInfoVO getUserProfile();

    /**
     * 更新用户信息
     * @param profileDTO 更新信息
     */
    void updateUserProfile(UserProfileDTO profileDTO);

    /**
     * 获取用户统计信息
     * @return 统计信息
     */
    UserStatsVO getUserStats();

    /**
     * 更新用户等级
     * @param userId 用户ID
     * @param level 等级
     */
    void updateUserLevel(Long userId, Integer level);

    /**
     * 更新用户状态
     * @param userId 用户ID
     * @param status 状态
     */
    void updateUserStatus(Long userId, Integer status);

    /**
     * 获取用户管理分页列表
     * @param queryDTO 查询条件
     * @return 用户管理分页列表
     */
    Page<UserManagementVO> getUserManagementPage(UserQueryDTO queryDTO);

    /**
     * 获取用户管理详情
     * @param userId 用户ID
     * @return 用户管理详情
     */
    UserManagementVO getUserManagementDetail(Long userId);

}